package com.hww.common.util;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.VibrationEffect;
import android.os.Vibrator;

import java.util.HashMap;

public class SoundPoolUtils {

    private static final int MAX_STREAMS = 2;
    private static final int DEFAULT_QUALITY = 0;
    private static final int DEFAULT_PRIORITY = 1;
    private static final int LEFT_VOLUME = 1;
    private static final int RIGHT_VOLUME = 1;
    private static final int LOOP = 0;
    private static final float RATE = 1.0f;

    private static SoundPoolUtils sSoundPoolUtils = new SoundPoolUtils();

    /**
     * 音频的相关类
     */
    private SoundPool mSoundPool;
    private Vibrator mVibrator;

    /**
     * 声音队列
     */
    private HashMap<Object, Integer> soundPoolMap;

    private Context mContext;

    private SoundPoolUtils() {
    }

    /**
     * 初始化当前对象类
     *
     * @param context
     */
    public void init(Context context) {
        mContext = context;
        //初始化运行的音频类
        intSoundPool();
        initVibrator();
    }

    /**
     * 方法描述: 初始化短音频的内容
     */
    private void intSoundPool() {
        //根据不同的版本进行相应的创建
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mSoundPool = new SoundPool.Builder()
                    .setMaxStreams(MAX_STREAMS)
                    .build();
        } else {
            /**
             * maxStreams：在声音池中允许同时存在的声音数量
             * streamType：声音流的类型(建议AudioManager.STREAM_MUSIC)
             * srcQuality：采样率转换器的质量。目前没有效果。默认值为0
             */
            mSoundPool = new SoundPool(MAX_STREAMS, AudioManager.STREAM_MUSIC, DEFAULT_QUALITY);
        }

        /*刷卡声音*/
//        putSound(Type.BEEP, R.raw.beep);
        /*中软刷身份证成功语音*/
//        putSound(Type.SUCCESS_ZR, R.raw.success_zr);
    }

//    /**
//     * 导入语音到语音池中，需要在使用之前导入或在初始化的时候同步导入
//     * @param type
//     * @param soundRes
//     */
//    public void putSound(Type type, int soundRes) {
//        if (null == soundPoolMap) {
//            soundPoolMap = new HashMap<>();
//        }
//        // 上下文，声音资源id，优先级
//        soundPoolMap.put(type, mSoundPool.load(mContext, soundRes, 0));
//    }

    /**
     * 导入语音到语音池中，需要在使用之前导入或在初始化的时候同步导入
     *
     * @param type
     * @param soundRes
     */
    public void putSound(Object type, int soundRes) {
        if (null == soundPoolMap) {
            soundPoolMap = new HashMap<>();
        }
        // 上下文，声音资源id，优先级
        soundPoolMap.put(type, mSoundPool.load(mContext, soundRes, 0));
    }

    /**
     * 方法描述: 初始化震动的对象
     */
    private void initVibrator() {
        mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
    }

    public static SoundPoolUtils getInstance() {
        return sSoundPoolUtils;
    }

//    public void playVideoIcCard() {
//        if (mSoundPool == null) {
//            intSoundPool();
//        }
//        if (null != soundPoolMap) {
//            try {
//                Integer integer = soundPoolMap.get(Type.BEEP);
//                if (null != integer) {
//                    mSoundPool.play(integer, LEFT_VOLUME, RIGHT_VOLUME, DEFAULT_PRIORITY, LOOP, RATE);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }

//    /**
//     * 播放中软身份证读卡成功声音
//     */
//    public void playIdCardVideo() {
//        if (mSoundPool == null) {
//            intSoundPool();
//        }
//        if (null != soundPoolMap) {
//            try {
//                Integer integer = soundPoolMap.get(Type.BEEP);
//                if (null != integer) {
//                    mSoundPool.play(integer, LEFT_VOLUME, RIGHT_VOLUME, DEFAULT_PRIORITY, LOOP, RATE);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }

    /**
     * @param resId 音频的资源ID
     *              方法描述: 开始播放音频
     */
    public void playVideo(int resId) {
        if (mSoundPool == null) {
            intSoundPool();
        }
        int load = mSoundPool.load(mContext, resId, DEFAULT_PRIORITY);
        mSoundPool.play(load, LEFT_VOLUME, RIGHT_VOLUME, DEFAULT_PRIORITY, LOOP, RATE);
    }

    /**
     * @param milliseconds 震动时间
     *                     方法描述: 开启相应的震动
     */
    public void startVibrator(long milliseconds) {
        if (mVibrator == null) {
            initVibrator();
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            VibrationEffect vibrationEffect = VibrationEffect.createOneShot(milliseconds, 100);
            mVibrator.vibrate(vibrationEffect);
        } else {
            mVibrator.vibrate(1000);
        }
    }

    /**
     * @param resId        资源id
     * @param milliseconds 震动时间
     *                     方法描述: 同时开始音乐和震动
     */
    public void startVideoAndVibrator(int resId, long milliseconds) {
        playVideo(resId);
        startVibrator(milliseconds);
    }

    /**
     * 方法描述:  释放相应的资源
     */
    public void release() {
        //释放所有的资源
        if (mSoundPool != null) {
            mSoundPool.release();
            mSoundPool = null;
        }

        if (mVibrator != null) {
            mVibrator.cancel();
            mVibrator = null;
        }
    }
}